home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / dsp / dspgroup / fft32010.arc / PROGRAM.3 < prev    next >
Encoding:
Text File  |  1984-11-13  |  5.2 KB  |  240 lines

  1.     IDT 'FFT2'
  2. *
  3. *    Cooley-Tukey Radix-2, DIF FFT Program for the TMS32010.
  4. *
  5. *    Single FFT butterfly.
  6. *    Complex input data - size limited only by program memory availability.
  7. *    Uses table lookup of the twiddle factors.
  8. *    No scaling is done on intermediate values in the program.
  9. *    External data RAM is addressed via peripheral I/O instructions.
  10. *         An address counter is required and is loaded by a write to
  11. *         port 0.  Data is read from and written to RAM via port 1.
  12. *         The address counter should increment after every read or write.
  13. *    Data in the external RAM assumes complex data with corresponding
  14. *         real and imaginary data values in consecutive locations.
  15. *
  16. *
  17. * N is the size of the transform.  N = 2**M.
  18. N EQU 64
  19. M EQU 6
  20. *
  21. * Data Memory Allocation.
  22. *
  23. XI    EQU 0        * Array value X(I)
  24. YI    EQU 1        * Array value Y(I)
  25. XL    EQU 2        * Array value X(L)
  26. YL    EQU 3        * Array value Y(L)
  27. XT    EQU 4        * Temporary - real part
  28. YT    EQU 5        * Temporary - imaginary part
  29. I    EQU 6        * 1st index
  30. L    EQU 7        * 2nd index
  31. COS    EQU 8        * Twiddle factor - real part
  32. SIN    EQU 9        * Twiddle factor - imaginary part
  33. IA    EQU 10        * Index to twiddle factors
  34. IE    EQU 11        * Increment to IA
  35. HOLDN    EQU 12        * Contains value N
  36. QUARTN    EQU 13        * Contains value N/4
  37. N1    EQU 14        * Increment to I.
  38. N2    EQU 15        * Separation of I and L
  39. J    EQU 16        * Loop counter
  40. ONE    EQU 17        * Contains value 1
  41. TABLE    EQU 18        * Location of coefficient table
  42. *
  43. * Begin program memory section.
  44. *
  45.       AORG 0
  46. START      LDPK 0
  47.       LACK 1
  48.       SACL ONE          * Initialize IE = 1
  49.       SACL IE
  50.       LT   ONE
  51.       MPYK SINE
  52.       PAC
  53.       SACL TABLE          * Table has address of cosine table
  54.       MPYK N
  55.       PAC
  56.       SACL HOLDN          * Holdn = N
  57.       SACL N2          * Initialize N2 = N
  58.       LAC  HOLDN,14
  59.       SACH QUARTN          * Quartn = N/4
  60.       LARK AR0,M-1          * AR0 contains K counter
  61. KLOOP         LARP 1
  62.          LAC  N2,15
  63.          SACH N1,1          * N1 = N2
  64.          SACH N2          * N2 = N2/2
  65.          ZAC
  66.          SACL IA
  67.          SACL J
  68.          LAR  AR1,N2      * AR1 contains J value
  69.          MAR  *-          * Start at N2-1
  70. JLOOP        LAC  TABLE    * Table is full size
  71.         ADD  IA
  72.         TBLR SIN       * Get twiddle factors
  73.         ADD  QUARTN
  74.         TBLR COS
  75.         LAC  IA
  76.         ADD  IE
  77.         SACL IA       * IA =  IA + IE
  78.         LAC  J,1
  79.         SACL I          * I = J  (data organized as real value followed
  80. *                  * by imaginary so address I is 2 times J).
  81. ILOOP           LAC    I
  82.            ADD    N2,1        * L = I + N2
  83.            SACL L
  84. *
  85.            OUT    I,PA0        * Output address of XI
  86.            IN    XI,PA1        * Read real and imaginary parts
  87.            IN    YI,PA1
  88.            OUT    L,PA0        * Output address of XL
  89.            IN    XL,PA1        * Read real and imaginary parts
  90.            IN    YL,PA1
  91. *
  92. * Compute butterfly.
  93. *
  94.            LAC    XI
  95.            SUB    XL
  96.            SACL XT        * XT = XI - XL
  97.            ADD    XL,1
  98.            SACL XI        * XI = XI + XL
  99.            LAC    YI
  100.            SUB    YL
  101.            SACL YT        * YT = YI - YL
  102.            ADD    YL,1
  103.            SACL YI        * YI = YI + YL
  104.            LT    COS
  105.            MPY    YT
  106.            PAC
  107.            LT    SIN
  108.            MPY    XT
  109.            SPAC
  110.            SACH YL,1        * YL = COS*YT - SIN*XT
  111.            MPY    YT
  112.            PAC
  113.            LT    COS
  114.            MPY    XT
  115.            APAC
  116.            SACH XL,1        * XL = COS*XT + SIN*YT
  117. *
  118. * Output results of the butterfly.
  119. *
  120.            OUT    I,PA0        * Output I value address.
  121.            OUT    XI,PA1        * Output real and imaginary parts.
  122.            OUT    YI,PA1
  123.            OUT    L,PA0        * Output L value address.
  124.            OUT    XL,PA1        * Output real and imaginary parts.
  125.            OUT    YL,PA1
  126. *
  127. * Add increment for next loop.
  128. *
  129.            LAC    I
  130.            ADD    N1,1        * I = I + N1
  131.            SACL I
  132.            SUB    HOLDN,1     * While I < N
  133.            BLZ    ILOOP
  134.            LAC  J
  135.            ADD  ONE         * J = J + 1
  136.            SACL J
  137.            BANZ JLOOP
  138.         LAC  IE,1
  139.         SACL IE            * IE = 2 * IE
  140.         LARP 0
  141.         BANZ KLOOP
  142. *
  143. * Digit reverse counter for radix-2 FFT computation.
  144. *
  145. DRC2    ZAC
  146.     SACL L
  147.     SACL I
  148.     LARP 0
  149.     LAR  AR0,HOLDN            * For I = 0 to N-2
  150.     MAR  *-
  151.     MAR  *-
  152. DRLOOP        SUB  L            * If I < L, then swap
  153.         BGEZ NOSWAP
  154. * Swap i and l values.
  155.             OUT  I,PA0
  156.             IN   XI,PA1
  157.             IN   YI,PA1
  158.             OUT  L,PA0
  159.             IN   XL,PA1
  160.             IN   YL,PA1
  161.             OUT  L,PA0
  162.             OUT  XI,PA1
  163.             OUT  YI,PA1
  164.             OUT  I,PA0
  165.             OUT  XL,PA1
  166.             OUT  YL,PA1
  167. NOSWAP        LAC  HOLDN
  168.         SACL J                * J = N
  169. INLOOP            LAC  L
  170.             SUB  J            * If L >= J then
  171.             BLZ  OUTL
  172.                 SACL L        * L = L - J
  173.                 LAC  J,15
  174.                 SACH J        * J = J/2.
  175.                 B    INLOOP
  176. OUTL        ADD  J,1
  177.         SACL L                * L = L + J
  178.         LAC  I
  179.         ADD  ONE,1
  180.         SACL I                * Increment I
  181.         BANZ DRLOOP
  182. *
  183. *  FFT complete.
  184. *
  185. WHOA    B WHOA
  186. *
  187. * Coefficient table (size of table is 3n/4).
  188. *
  189. SINE EQU $
  190.       DATA 0
  191.       DATA 3211
  192.       DATA 6392
  193.       DATA 9511
  194.       DATA 12539
  195.       DATA 15446
  196.       DATA 18204
  197.       DATA 20787
  198.       DATA 23169
  199.       DATA 25329
  200.       DATA 27244
  201.       DATA 28897
  202.       DATA 30272
  203.       DATA 31356
  204.       DATA 32137
  205.       DATA 32609
  206. COSINE EQU $
  207.       DATA 32767
  208.       DATA 32609
  209.       DATA 32137
  210.       DATA 31356
  211.       DATA 30272
  212.       DATA 28897
  213.       DATA 27244
  214.       DATA 25329
  215.       DATA 23169
  216.       DATA 20787
  217.       DATA 18204
  218.       DATA 15446
  219.       DATA 12539
  220.       DATA 9511
  221.       DATA 6392
  222.       DATA 3211
  223.       DATA 0
  224.       DATA -3211
  225.       DATA -6392
  226.       DATA -9511
  227.       DATA -12539
  228.       DATA -15446
  229.       DATA -18204
  230.       DATA -20787
  231.       DATA -23169
  232.       DATA -25329
  233.       DATA -27244
  234.       DATA -28897
  235.       DATA -30272
  236.       DATA -31356
  237.       DATA -32137
  238.       DATA -32609
  239.       END
  240.